def main(host, port):
    try:
        capabilities = AgentCapabilities(streaming=True, pushNotifications=True)
        skill = AgentSkill(
            id="search_web",
            name="搜索工具",
            description="搜索web上的相关信息",
            tags=["Web搜索", "互联网搜索"],
            examples=["请搜索最新的黑神话悟空的消息"],
        )

        agent_card = AgentCard(
            name="搜索助手",
            description="搜索Web上的相关信息",
            url=f"http://{host}:{port}/",
            version="1.0.0",
            defaultInputModes=SearchAgent.SUPPORTED_CONTENT_TYPES,
            defaultOutputModes=SearchAgent.SUPPORTED_CONTENT_TYPES,
            capabilities=capabilities,
            skills=[skill],
        )

        notification_sender_auth = PushNotificationSenderAuth()
        notification_sender_auth.generate_jwk()
        server = A2AServer(
            agent_card=agent_card,
            task_manager=AgentTaskManager(agent=SearchAgent(), notification_sender_auth=notification_sender_auth),
            host=host,
            port=port,
        )

        server.app.add_route(
            "/.well-known/jwks.json", notification_sender_auth.handle_jwks_endpoint, methods=["GET"]
        )

        logger.info(f"正在启动服务器，地址：{host}:{port}")
        server.start()
    except MissingAPIKeyError as e:
        logger.error(f"错误：{e}")
        exit(1)
    except Exception as e:
        logger.error(f"服务器启动过程中发生错误：{e}")
        exit(1)


if __name__ == "__main__":
    main()

# 基本过程是声明Agent的能力->发布成Agent卡片->启动A2AServer（uvicorn)。
# 其核心是一个借助于Agent来完成任务的task_manager。

"""
【客户端应用测试】
用官方提供的客户端命令行来测试这个Server。
可以看到，客户端启动时会读取服务端的Agent卡片，了解到Agent的能力与特性（比如Streaming代表支持流式）：

现在向这个Agent发送一个任务：

客户端采用了Streaming输出，所以这里可以看到一些中间输出。这些输出可以帮助理解A2A协议的一些标准，比如：
中间过程都是用message来传递，发送的角色是agent
最终的任务输出则是artifact，代表这是任务的最后产出
不管是message还是artifact，具体内容都是有多个part组成


我们来测试几个能力：



git add .


"""